Add gtk_show_uri_on_window
authorMatthias Clasen <mclasen@redhat.com>
Sat, 18 Jun 2016 21:59:40 +0000 (17:59 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 8 Jul 2016 04:07:07 +0000 (00:07 -0400)
The gtk_show_uri API doesn't let us specify a parent window. With
portals, there may be an intermediate dialog, for which it is nice
to have parent window information, to place it properly.

https://bugzilla.gnome.org/show_bug.cgi?id=768499

docs/reference/gtk/gtk3-sections.txt
gtk/gtkshow.c
gtk/gtkshow.h

index 0c072c6faf09d55aab9ecb879e77610577dcc82e..95e6bbfb2cb7d6de83eca6f467f14149571b353e 100644 (file)
@@ -7514,6 +7514,7 @@ gtk_mount_operation_get_parent
 gtk_mount_operation_set_screen
 gtk_mount_operation_get_screen
 gtk_show_uri
+gtk_show_uri_on_parent
 <SUBSECTION Standard>
 GTK_IS_MOUNT_OPERATION
 GTK_IS_MOUNT_OPERATION_CLASS
index 7a03f9e201a4fb475153ec5160ccd1f10d5ab7ac..c237405640fe7ae809b5c2d0536590dc0e157ce4 100644 (file)
 
 #include "gtkshow.h"
 
+#ifdef GDK_WINDOWING_X11
+#include "x11/gdkx.h"
+#endif
+
 /**
  * gtk_show_uri:
  * @screen: (allow-none): screen to show the uri on
@@ -70,7 +74,67 @@ gtk_show_uri (GdkScreen    *screen,
   gdk_app_launch_context_set_screen (context, screen);
   gdk_app_launch_context_set_timestamp (context, timestamp);
 
-  ret = g_app_info_launch_default_for_uri (uri, (GAppLaunchContext*)context, error);
+  ret = g_app_info_launch_default_for_uri (uri, G_APP_LAUNCH_CONTEXT (context), error);
+  g_object_unref (context);
+
+  return ret;
+}
+
+/**
+ * gtk_show_uri_on_window:
+ * @parent: (allow-none): parent window
+ * @uri: the uri to show
+ * @timestamp: a timestamp to prevent focus stealing
+ * @error: a #GError that is returned in case of errors
+ *
+ * A convenience function for launching the default application
+ * to show the uri. Like gtk_show_uri(), but takes a window
+ * as transient parent instead of a screen.
+ *
+ * Returns: %TRUE on success, %FALSE on error
+ *
+ * Since: 3.22
+ */
+gboolean
+gtk_show_uri_on_window (GtkWindow   *parent,
+                        const char  *uri,
+                        guint32      timestamp,
+                        GError     **error)
+{
+  GdkAppLaunchContext *context;
+  gboolean ret;
+  GdkDisplay *display;
+
+  g_return_val_if_fail (uri != NULL, FALSE);
+
+  if (parent)
+    display = gtk_widget_get_display (GTK_WIDGET (parent));
+  else
+    display = gdk_display_get_default ();
+
+  context = gdk_display_get_app_launch_context (display);
+
+  if (parent)
+    {
+      GdkWindow *window = gtk_widget_get_window (GTK_WIDGET (parent));
+#ifdef GDK_WINDOWING_X11
+      if (GDK_IS_X11_WINDOW(window))
+        {
+          char *parent_window_str;
+
+          parent_window_str = g_strdup_printf ("x11:%x", (guint32)gdk_x11_window_get_xid (window));
+          g_app_launch_context_setenv (G_APP_LAUNCH_CONTEXT (context),
+                                       "PARENT_WINDOW_ID",
+                                       parent_window_str);
+          g_free (parent_window_str);
+        }
+#endif
+    }
+
+  gdk_app_launch_context_set_timestamp (context, timestamp);
+
+  ret = g_app_info_launch_default_for_uri (uri, G_APP_LAUNCH_CONTEXT (context), error);
+
   g_object_unref (context);
 
   return ret;
index c4acd9c755d8faa804ce282036c61d6e6eae85bf..f4e3feb8aa891beb6bcb6dcd1835f0607b2a8ee9 100644 (file)
@@ -25,6 +25,8 @@
 #error "Only <gtk/gtk.h> can be included directly."
 #endif
 
+#include <gtk/gtkwindow.h>
+
 G_BEGIN_DECLS
 
 GDK_AVAILABLE_IN_ALL
@@ -33,6 +35,12 @@ gboolean gtk_show_uri  (GdkScreen   *screen,
                         guint32      timestamp,
                         GError     **error);
 
+GDK_AVAILABLE_IN_3_22
+gboolean gtk_show_uri_on_window (GtkWindow   *parent,
+                                 const char  *uri,
+                                 guint32      timestamp,
+                                 GError     **error);
+
 G_END_DECLS
 
 #endif /* __GTK_SHOW_H__ */